package Example3point2;

public class MyDate {
    private int year, month, day;
    private static int thisYear;

    static {
        thisYear = 2018;
    }

    public MyDate(int year, int month, int day) {
        this.set(year, month, day);
    }

    public MyDate() {
        this(1970, 1, 1);
    }

    public MyDate(MyDate date) {
        this.set(date);
    }

    public void set(int year, int month, int day) {
        this.year = year;
        this.month = (month >= 1 && month <= 12) ? month : 1;
        this.day = (day >= 1 && day <= 31) ? day : 1;
    }

    public void set(MyDate date) {
        this.set(date.year, date.month, date.day);
    }

    public int getYear() {
        return this.year;
    }

    public int getMonth() {
        return this.month;
    }

    public int getDay() {
        return this.day;
    }

    public String toString() {
        return year + "年" + String.format("%02d", month) + "月" + String.format("%02d", day) + "日";
    }

    public static int getThisYear() {
        return thisYear;
    }

    public static boolean isLeapYear(int year) {
        return year % 400 == 0 || year % 100 != 0 && year % 4 == 0;
    }

    public boolean isLeapYear() {
        return isLeapYear(this.year);
    }

    public boolean equals(MyDate date) {
        return this == date || date != null && this.year == date.year && this.month == date.month && this.day == date.day;
    }

    public static int daysOfMonth(int year, int month) {
        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                return 31;
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
            case 2:
                return MyDate.isLeapYear(year) ? 29 : 28;
            default:
                return 0;
        }
    }

    public int daysOfMonth() {
        return daysOfMonth(this.year, this.month);
    }

    public void tomorrow() {
        this.day = this.day % this.daysOfMonth() + 1;
        if (this.day == 1) {
            this.month = this.month % 12 + 1;
            if (this.month == 1)
                this.year++;
        }
    }

    public MyDate yesterday() {
        MyDate date = new MyDate(this);
        date.day--;
        if (date.day == 0) {
            date.month = (date.month - 2 + 12) % 12 + 1;
            if (date.month == 12)
                date.year--;
            date.day = daysOfMonth(date.year, date.month);
        }
        return date;
    }
}

class MyDate_ex {
    public static void main(String[] args) {
        System.out.println("今年是" + MyDate.getThisYear() + ",闰年？" + MyDate.isLeapYear(MyDate.getThisYear()));
        MyDate d1 = new MyDate(2017, 12, 31);
        System.out.println(d1.getYear() + "年，闰年？" + d1.isLeapYear());
        MyDate d2 = new MyDate(d1);
        System.out.println("d1:" + d1 + ",d2:" + d2 + ",d1==d2?" + (d1 == d2) + ",d1.equals(d2)?" + d1.equals(d2));
        System.out.print(d1 + "的明天是");
        d1.tomorrow();
        System.out.println(d1 + "\n" + d2 + "的昨天是" + (d2 = d1.yesterday()));
    }
}
